package main

import (
	"fmt"
	"time"
)

//使用数值的大小作为休眠的实践
//可在  多线程，分布式  中使用

var flag bool           // 排序是否完成
var container chan bool //执行的管道数
var count int = 0

func main() {
	arr := []int{20, 15, 39, 10, 9, 8}

	flag = true
	container = make(chan bool, 6)

	for i := 0; i < len(arr); i++ {
		go tosleep(arr[i])
	}

	go listen(6)

	for flag {
		time.Sleep(1 * time.Second)
	}
}

func listen(size int) {
	if flag {
		select {
		case <-container:
			count++
			if size >= count {
				flag = false
			}
		}
	}
}

// 沉睡和操作，
func tosleep(val int) {
	// 沉睡的时间长度不一样
	// time.Sleep(time.Duration(val) * time.Microsecond * 100)
	// time.Sleep(time.Duration(val) * time.Microsecond )
	time.Sleep(time.Duration(val) * time.Microsecond * 1000)
	fmt.Println("sleep", val)
	container <- true
}
